package middlewares

import (
	"encoding/json"
	"fmt"
	"net/http"
	"strconv"
	"woo-server/coms/structs"
	"woo-server/coms/utils"
	"woo-server/models/api"
	"woo-server/models/db/system"
	"woo-server/start/inits"

	"github.com/gin-gonic/gin"
)

// 终止请求
func contextAbort(context *gin.Context, message string) {
	resultModel := api.BadRequestResultEntity(message)
	context.String(http.StatusOK, resultModel.ToJson())
	context.Abort()
}

// 抛出401
func contextUnauthorized(context *gin.Context, message string) {
	resultModel := api.BadRequestResultEntity(message)
	context.String(http.StatusUnauthorized, resultModel.ToJson())
	context.Abort()
}

func CheckAuthSignature() gin.HandlerFunc {
	return func(context *gin.Context) {
		// 获取登录态
		id, name, roleId, err := utils.GetLoginCookie(context.Request)
		fmt.Println("1111", err)
		if err != nil {
			utils.LogError("获取登录态失败:" + err.Error())
			contextUnauthorized(context, "请重新登录")
			return
		}
		// 登录信息
		loginUser := structs.AuthClaim{
			UserId: id,
			RoleId: roleId,
			Name:   name,
		}
		context.Request.Header.Add(utils.GetConfigValue(inits.LOGIN_USER_KEY), utils.ToJson(loginUser))
		context.Next()
	}
}

func CheckAuthRole() gin.HandlerFunc {
	return func(context *gin.Context) {
		_, _, roleId, err := utils.GetLoginCookie(context.Request)
		// 如果是超级管理员则跳过权限校验
		if roleId == 1 {
			context.Next()
			return
		}
		fmt.Println(err)
		//获取访问API接口
		Path := context.FullPath()
		fmt.Println("用户请求接口:  ", Path)
		// 获取用户权限菜单缓存
		result, _ := utils.RedisClient.Get("RoleMenuList_" + strconv.FormatInt(int64(roleId), 10) + "_noTree").Result()

		var checkError bool = false
		// 获取缓存菜单
		var AdminMenus []system.AdminMenus
		json.Unmarshal([]byte(result), &AdminMenus)
		if len(AdminMenus) <= 0 {
			// 未通过菜单权限校验
			utils.CheckRoleApiError("权限校验失败,Redis缓存读取失败!")
			contextUnauthorized(context, "网络异常,请重新登录!")
			return
		}
		for i := 0; i < len(AdminMenus); i++ {
			if AdminMenus[i].Url == Path {
				checkError = true
				break
			}
		}
		if !checkError {
			// 未通过菜单权限校验
			utils.LogError("权限校验失败")
			contextUnauthorized(context, "非法请求")
			return
		} else {
			context.Next()
			return
		}

	}
}
